package com.xrui.parser;

import org.antlr.v4.runtime.tree.TerminalNode;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class ASTEvaluator extends ExprSyntaxBaseVisitor<Object>{

    @Override public Object visitExpression(ExprSyntaxParser.ExpressionContext ctx) {
        TerminalNode plusNode = ctx.PLUS();
        if(plusNode != null && ctx.expression().size() >= 2){
            List<ExprSyntaxParser.ExpressionContext> list = ctx.expression();
            ExprSyntaxParser.ExpressionContext expr = null;
            for(int i =0; i< list.size();i++){
                expr = list.get(i);
            }
            Object left  = visitExpression(ctx.expression(0));


            Object right = visitExpression(ctx.expression(1));
            Object result = left.toString() + right.toString();
            return result;
        }
        TerminalNode IdNode = ctx.Id();
        if(IdNode != null){
            return IdNode.getText();
        }
        ExprSyntaxParser.FuncnameContext funcnameCtx = ctx.funcname();
        if(funcnameCtx != null){
            int paramNumber = ctx.expression().size();
            ArrayList<Object> ar = new ArrayList<>(paramNumber);
            for(int i =0; i< paramNumber;i++){
                ar.add(visitExpression(ctx.expression(i)));
            }
            Random random = new java.util.Random();
            long l = random.nextLong();
            return String.valueOf(l);
        }
        if(ctx.LP() != null ){
            if( ctx.expression() != null && ctx.expression().size() > 0)
                return visitExpression(ctx.expression(0));
            else
                return "";

        }


        return "";
    }

    @Override public Object visitFuncname(ExprSyntaxParser.FuncnameContext ctx) {
        TerminalNode randomNode = ctx.Random();
         return  randomNode.getText();
    }

}
